package spectra.ee.web.api.model;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import spectra.base.util.StringUtil;
import spectra.ee.web.api.ApiPublic;
import spectra.ee.web.common.model.SurveyResponse;
import net.sf.json.JSONObject;

/**
 * 파라메터 데이터 타입이 json 인 경우 파싱한다.
 * ex) {service: faq, command:getFaqList, ...}
 * 필수 파라메터 service, command, form
 * 
 * @author dhheo
 *
 */
public class JsonForm extends ParameterForm
{
	public JsonForm(Map parameterMap) throws Exception
    {
    	super(parameterMap);
    }
	
	public void parsingAndSetting(Map parameterMap) throws Exception
	{
		//json 파라메터 파싱하여 필요한 폼 데이터를 가져온다. 
		//간단한 파라메터이므로 파서를 사용하지 않고 간단한 validation 과 함께 파싱한다.
		String data = (String)parameterMap.get(ApiPublic.PARAM_CMD);
		//데이터가 없는 경우 예외 처리
		if (StringUtil.isEmpty(data))
		{
			throw new Exception("Invalid parameter! parameter 'data' is missing");
		}
		//
		JSONObject json = JSONObject.fromObject(data);
		Map classMap = new HashMap();
		classMap.put("surveyResponseList", SurveyResponse.class);
		Map jsonMap = (Map)JSONObject.toBean(json, java.util.HashMap.class, classMap);
		
		// { ... } 안의 데이터만 가져온다.
		/*String dataString = data.substring(data.indexOf("{") + 1, data.indexOf("}"));
		dataString = dataString.replaceAll("\"", "");
		String[] keyValues = dataString.split(",");
		String key = null;
		String value = null;
		String[] temp;
		Map newParameterMap = new HashMap();
		*/
		String key = null;
		Object value = null;
		Set keys = jsonMap.keySet();
		for (Iterator it = keys.iterator(); it.hasNext();)
		{
			key = (String)it.next();
			value = (Object)jsonMap.get(key);
			
			if (key.equals(ApiPublic.PARAM_AUTH_KEY))
			{
				setAuthKey((String)value);
			}
			else if (key.equals(ApiPublic.PARAM_SERVICE))
			{
				setServiceName((String)value);
			}
			else if (key.equals(ApiPublic.PARAM_COMMAND))
			{
				setCommand((String)value);
			}
			else if (key.equals(ApiPublic.PARAM_FORM))
			{
				setFormName((String)value);
			}
			//newParameterMap.put(key, value);
			//ArrayList 형인 경우
			else if(value instanceof ArrayList)
			{
				
			}
		}
    	setParameterMap(jsonMap);
	}
		
	//테스트용 main 함수
	public static void main(String[] args)
	{
		Map paramMap = new HashMap();
		
		try
		{
			paramMap.put("data", "{service: faq, command:getFaqList}");
			JsonForm json = new JsonForm(paramMap);
			
			System.out.println("service : " + json.getServiceName());
			System.out.println("command : " + json.getCommand());
			System.out.println("form : " + json.getFormName());
		}
		catch(Exception e)
		{
			
		}
	}

}
